package com.foo.designpattern.state.state1;

import java.util.HashMap;
import java.util.Map;

/**
 * com.foo.designpattern.state.state1
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-06-08 16:57.
 *
 * @Description 环境管理(Context)角色：投票管理对象
 * 环境管理角色：也称为上下文，定义客户端所感兴趣的接口，并且保留一个具体状态类的实例。
 */

public class VoteManager {
    // 持有状态处理对象
    private VoteState state = null;
    /**
     * 记录用户投票的结果
     * Map<String, String>对应Map<用户名, 投票的选项>
     */
    private Map<String, String> mapVote = new HashMap<String, String>();
    /**
     * 记录用户投票次数
     * Map<String, Integer>对应Map<用户名, 投票的次数>
     */
    private Map<String, Integer> mapVoteCount = new HashMap<String, Integer>();

    public VoteState getState() {
        return state;
    }

    public void setState(VoteState state) {
        this.state = state;
    }

    /**
     * 获取记录用户投票结果的Map
     *
     * @return 记录用户投票结果的Map
     */
    public Map<String, String> getMapVote() {
        return mapVote;
    }

    public Map<String, Integer> getMapVoteCount() {
        return mapVoteCount;
    }

    /**
     * 投票：客户端感兴趣的方法
     *
     * @param user     投票人
     * @param voteItem 投票的选项
     */
    public void vote(String user, String voteItem) {
        Integer oldVoteCount = this.getMapVoteCount().get(user);
        if (null == oldVoteCount) {
            oldVoteCount = 0;
        }
        oldVoteCount++;
        this.getMapVoteCount().put(user, oldVoteCount);
        if (oldVoteCount == 1) {
            this.setState(new NormalVoteState());
        } else if (oldVoteCount > 1 && oldVoteCount < 5) {
            this.setState(new RepeatVoteState());
        } else if (oldVoteCount >= 5 && oldVoteCount < 8) {
            this.setState(new SpiteVoteState());
        } else {
            this.setState(new BlackVoteState());
        }
        this.getState().vote(user, voteItem, this);
    }
}
